#define ElemType int
#define MaxSize 50

typedef struct //顺序循环队列 {用静态数组实现【静态数组就是有连续的存储空间和固定的大小:MaxSize * sizeof(ElemType)】}
{
    ElemType data[MaxSize]; //存放队列元素
    int front, rear;        //队头指针和队尾指针
} SqQueue;

//注意：这里以队头指针指向队头元素，队尾指针指向队尾元素的下一个位置的队列为例！

void InitQueue(SqQueue &Q) //初始化队列
{
    Q.rear = Q.front = 0; //初始化队首、队尾指针
    return;
}

bool IsEmpty(SqQueue Q) //判队空
{
    if (Q.rear == Q.front) //队空条件
        return true;
    else
        return false;
}

bool EnQueue(SqQueue &Q, ElemType x) //入队
{
    if ((Q.rear + 1) % MaxSize == Q.front)  //队满则报错
        return false;
    Q.data[Q.rear] = x;                     //使x入队
    Q.rear = (Q.rear + 1) % MaxSize;        //队尾指针加1取模(循环队列的精髓！！)
    return true;
}

bool DeQueue(SqQueue &Q, ElemType &x) //出队
{
    if(Q.rear == Q.front)               //队空则报错
        return false;
    x = Q.data[Q.front];                //把队头元素通过x带出来
    Q.front = (Q.front + 1) % MaxSize;  //队头指针加1取模（循环队列的精髓！！ 其实队头、队尾都在往后移！！）
    return true;
}